import sys
import re
import os
# 统计字符数
def count_characters(text):
    return len(text)
# 统计单词数
def count_words(text):
    words = re.findall(r'\b[a-zA-Z]+\b', text)
    return len(words)
# 统计句子数
def count_sentences(text):
    sentences = re.split(r'[.!?]+', text)
    sentences = [s.strip() for s in sentences if s.strip()]
    return len(sentences)
# 统计代码行信息
def count_code_lines(text, filename):
    lines = text.split('\n')
    total_lines = len(lines)
    code_lines = 0
    comment_lines = 0
    blank_lines = 0   
    # 获取文件扩展名
    _, file_extension = os.path.splitext(filename)
    file_extension = file_extension.lower()
    supported_extensions = ['.py', '.c', '.cpp']  
    if file_extension not in supported_extensions:
        print(f"错误: 不支持的文件类型 '{file_extension}'")
        print("支持的代码文件类型: .py, .c, .cpp")
        return 0, 0, 0, 0
    in_block_comment = False  
    for line in lines:
        stripped_line = line.strip()
        # 统计空行
        if not stripped_line:
            blank_lines += 1
            continue 
        # Python文件注释识别
        if file_extension == '.py':
            if in_block_comment:
                comment_lines += 1
                # 检查多行注释是否结束
                if "'''" in stripped_line or '"""' in stripped_line:
                    in_block_comment = False
            else:
                # 检查单行注释
                if stripped_line.startswith('#'):
                    comment_lines += 1
                # 检查多行注释开始
                elif stripped_line.startswith("'''") or stripped_line.startswith('"""'):
                    comment_lines += 1
                    # 如果这一行没有结束标记，则进入多行注释状态
                    if (stripped_line.startswith("'''") and stripped_line.count("'''") == 1) or \
                       (stripped_line.startswith('"""') and stripped_line.count('"""') == 1):
                        in_block_comment = True
                else:
                    code_lines += 1                
        # C/C++文件注释识别
        elif file_extension in ['.c', '.cpp', '.h']:
            # 移除字符串内容以避免误判
            temp_line = re.sub(r'".*?"', '', line)  # 移除双引号字符串
            temp_line = re.sub(r"'.*?'", '', temp_line)  # 移除单引号字符串
            stripped_temp = temp_line.strip()
            
            if in_block_comment:
                comment_lines += 1
                # 检查多行注释是否结束
                if '*/' in stripped_temp:
                    in_block_comment = False
            else:
                # 检查单行注释
                if stripped_temp.startswith('//'):
                    comment_lines += 1
                # 检查多行注释开始
                elif '/*' in stripped_temp:
                    comment_lines += 1
                    # 如果这一行没有结束标记，则进入多行注释状态
                    if '*/' not in stripped_temp:
                        in_block_comment = True
                else:
                    code_lines += 1
    return total_lines, code_lines, comment_lines, blank_lines
# 主函数
def main():
    # 检查参数数量
    if len(sys.argv) != 3:
        print("输入格式有误！")
        print("使用方法: python wc.py [参数] [文件名]")
        print("参数:")
        print("  -c  统计字符数")
        print("  -w  统计单词数")
        print("  -s  统计句子数")
        print("  -l  统计代码行信息（支持.py, .c, .cpp文件）") 
        print("按回车键退出...")
        input()
        return     
    param = sys.argv[1]
    filename = sys.argv[2]    
    try:
        # 读取文件
        with open(filename, 'r', encoding='utf-8') as file:
            text = file.read()
        if param == '-c':
            count = count_characters(text)
            print(f"文件 {filename} 的字符数: {count}")
        elif param == '-w':
            count = count_words(text)
            print(f"文件 {filename} 的单词数: {count}")
        elif param == '-s':
            count = count_sentences(text)
            print(f"文件 {filename} 的句子数: {count}")
        elif param == '-l':  # 新增代码统计功能
            total, code, comment, blank = count_code_lines(text, filename)
            print(f"文件 {filename} 的代码统计：")
            print(f"  总行数: {total}")
            print(f"  代码行: {code}")
            print(f"  注释行: {comment}")
            print(f"  空行: {blank}")
        else:
            print("错误: 无效参数")
            print("可用参数: -c, -w, -s, -l")  # 更新参数列表 
        print("按回车键退出...")
        input()          
    except FileNotFoundError:
        print(f"错误: 找不到文件 '{filename}'")
        print("按回车键退出...")
        input()
    except Exception as e:
        print(f"错误: {e}")
        print("按回车键退出...")
        input()
# 程序入口
if __name__ == "__main__":
    main()